/* sdrmain.c

This file is part of a program that implements a Software-Defined Radio.

Copyright (C) 2004, 2005, 2006-5 by Frank Brickle, AB2KT and Bob McGwier, N4HY

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

The authors can be reached by email at

ab2kt@arrl.net
or
rwmcgwier@comcast.net

or by paper mail at

The DTTS Microwave Society
6 Kathleen Place
Bridgewater, NJ 08807
*/

#include <include.h>
#include <update.h>
#include <local.h>

// elementary defaults
struct _loc loc;

/////////////////////////////////////////////////////////////////////////
// most of what little we know here about the inner loop,512
// functionally speaking

// This is in sdr.c
extern void reset_meters (void);
extern void reset_spectrum (void);
extern void reset_counters (void);
extern void setup_workspace (REAL rate,
							 int buflen,
							 SDRMODE mode,
							 char *wisdom,
							 int specsize,
							 int numrecv,
							 int cpdsize);
extern void destroy_workspace (void);

// This is in update.c
extern void init_update();

//========================================================================

//========================================================================
// hard defaults, then environment

void create_globals(void) {
  int i;
  uni = (struct _uni *) safealloc(1, sizeof(struct _uni), "uni global");
  for (i = 0; i < MAXRX; i++)
    rx[i] = (struct _rx *) safealloc(1, sizeof(struct _rx), "rx global");
  tx = (struct _tx *) safealloc(1, sizeof(struct _tx), "tx global");
}

void setup_defaults () {
	loc.name[0] = 0;		// no default name for jack client
	loc.def.rate = DEFRATE;
	loc.def.size = DEFSIZE;
	loc.def.nrx = MAXRX;
	loc.def.mode = DEFMODE;
	loc.def.spec = DEFSPEC;
	loc.mult.ring = RINGMULT;
	loc.def.comp = DEFCOMP;
}

void dsp_setup ()
{
    create_globals ();
	setup_defaults ();
	init_update();
	uni->meter.flag = TRUE;
	uni->spec.flag = TRUE;
	setup_workspace (	loc.def.rate,
					loc.def.size,
					loc.def.mode,
					loc.path.wisdom,
					loc.def.spec,
					loc.def.nrx,
					loc.def.comp);
	uni->spec.flag = TRUE;
	uni->spec.type = SPEC_POST_FILT;
	uni->spec.scale = SPEC_PWR;
	uni->spec.rxk = 0;
	reset_meters ();
	reset_spectrum ();
	reset_counters ();
}

void dsp_tear_down() {

    destroy_workspace();
}
